<?php
/**
 *
 * App.class.php
 * User: kalvin
 * Date: 2018/1/6
 * Time: 上午10:19
 */

namespace Core;

/**
 * Class App  框架核心的是方法
 * @package Core
 */
class App
{
    public static $config;

    /**
     *  定义路径常量
     */
    public static function defineDir()
    {
        define('BASE_DIR', dirname(__DIR__) . '/');
        define('APP_DIR', BASE_DIR . 'App/');
        define('CONF_DIR', BASE_DIR . 'Conf/');
        define('CORE_DIR', BASE_DIR . 'Core/');
        define('PUBLIC_DIR', BASE_DIR . 'Public/');
        define('VENDOR_DIR', BASE_DIR . 'Vendor/');

    }

    /**
     *  读取配置项到静态变量以便其他数据使用
     */
    public static function loadConfig()
    {
        self::$config = include CONF_DIR . 'App.php';
    }

    /**
     *  设置请求头
     */
    public static function setHeader()
    {
        header('content-type:text/html;charset=' . self::$config['App_charset']);
    }

    public static function autoLoadClass()
    {
        spl_autoload_register(function ($classname) {
            $filename = str_replace('\\', '/', $classname . '.class.php');
            if (!file_exists($filename)) {
                echo '抱歉：您在加载的文件：' . $filename . '不存在！';
                return false;
            } else {
                include_once $filename;
            }
        });
    }

    /**
     *  解析url 的方法 负责把url 分发到不同控制器的方法中
     */
    public static function getUrl()
    {
        // 无论传来的数据大小写统统转换成首字母大写，防止误操作
        $platform = isset($_GET['p']) ? ucfirst(strtolower($_GET['p'])) : 'Back';
        $controller = isset($_GET['c']) ? ucfirst(strtolower($_GET['c'])) : 'Home';
        $action = isset($_GET['a']) ? ucfirst(strtolower($_GET['a'])) : 'index';
        define('PLATFORM', $platform);
        define('CONTROLLER', $controller);
        define('ACTION', $action);

    }

    public static function loadVendor()
    {
        include VENDOR_DIR . 'Smarty/Smarty.class.php';
    }

    /**
     *  分发路由 根据url 实例化控制器并调用方法
     */
    public static function dispathRouter()
    {
        //$trueControllerName demo : App\Back\HomeController
        $trueControllerName = 'App\\' . PLATFORM . '\\Controller\\' . CONTROLLER . 'Controller';
        $ControllerObj = new $trueControllerName;
        $action = ACTION;
        $ControllerObj->$action();
    }

    /**
     *  启动的方法
     */
    public static function run()
    {

        self::defineDir();
        self::loadConfig();
        self::setHeader();
        self::loadVendor();
        self::autoLoadClass();

        self::getUrl();
        self::dispathRouter();
    }
}